// import axios from 'axios'
// import type { AxiosInstance} from 'axios'
// import type { HYRequestConfig } from './type.ts'
//
// // 拦截器：蒙版Loading/token/修改配置
// /**
//  * 两个难点：
//  * 1.拦截器进行精细控制。
//  *  > 全局拦截器。
//  *  > 实例拦截器。
//  *  > 单次请求拦截器。
//  *
//  * 2.响应结果的类型处理（泛型）
//  */
// class HYRequest {
//   instance: AxiosInstance
//
//   // request 实例 => axios 的实例
//   constructor(config: HYRequestConfig) {
//     this.instance = axios.create(config)
//
//     // 每个 instance 实例都添加拦截器。
//     this.instance.interceptors.request.use(
//       (config) => {
//         // loading/token。
//         console.log('全局请求成功拦截')
//         return config
//       }, (err) => {
//         console.log('全局请求失败拦截!!!', err)
//         return err
//       }
//     )
//     this.instance.interceptors.response.use(
//       (res) => {
//         console.log('全局响应成功拦截')
//         return res.data
//       },
//       (err) => {
//         console.log('全局响应失败的拦截')
//         return err
//       }
//     )
//
//     // 针对特点的 hyRequest实例添加拦截器。
//     this.instance.interceptors.request.use(
//       config.interceptors?.requestSuccessFn,
//       config.interceptors?.requestFailureFn
//     )
//     this.instance.interceptors.response.use(
//       config.interceptors?.responseSuccessFn,
//       config.interceptors?.responseFailureFn
//     )
//   }
//
//   // 封装网络请求的方法。
//   // T => IHomeData。
//   request<T = any>(config: HYRequestConfig<T>) {
//     // 单次请求的成功拦截处理
//     if (config.interceptors?.requestSuccessFn) {
//       config = config.interceptors.requestSuccessFn(config)
//     }
//
//     // 返回 Promise。
//     return new Promise<T>((resolve, reject) => {
//       this.instance
//         .request<any, T>(config)
//         .then((response) => {
//           // 单次响应的成功拦截处理。
//           if (config.interceptors?.responseSuccessFn) {
//             response = config.interceptors.responseSuccessFn(response)
//           }
//           resolve(response)
//         })
//         .catch((err) => {
//           reject(err)
//         })
//     })
//   }
//
//   get<T = any>(config: HYRequestConfig<T>) {
//     return this.request({ ...config, method: 'GET' })
//   }
//   post<T = any>(config: HYRequestConfig<T>) {
//     return this.request({ ...config, method: 'POST' })
//   }
//   delete<T = any>(config: HYRequestConfig<T>) {
//     return this.request({ ...config, method: 'DELETE' })
//   }
//   patch<T = any>(config: HYRequestConfig<T>) {
//     return this.request({ ...config, method: 'PATCH' })
//   }
// }
// export default HYRequest


//
//
// import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
//
// // 创建axios实例
// const axiosInatance = axios.create({
//   baseURL: 'http://127.0.0.1:5173', // api的base URL
//   timeout: 5000, // 设置请求超时时间
//   responseType: 'json',
//   withCredentials: true, // 是否允许带cookie这些
//   headers: {
//     'Content-Type': 'application/json;charset=utf-8',
//     'token': '777',
//   },
// });
//
// // 请求拦截器
// const requestInterceptor = axiosInatance.interceptors.request.use(
//   // 在发送请求之前调用
//   (config: AxiosRequestConfig): AxiosRequestConfig => {
//     const newConfig = config;
//     // 添加 token
//     Object.assign(newConfig.headers, { 'token': 'some-token' });
//     return newConfig;
//   },
//   (error: AxiosError): Promise<never> => {
//     // 对请求错误时调用，可自己定义
//     return Promise.reject(error);
//   }
// );
//
// // 响应拦截器
// const responseInterceptor = axiosInatance.interceptors.response.use(
//   (response: AxiosResponse): AxiosResponse => {
//     // 2xx 范围内的状态码都会触发该函数。对响数据成功时调用。
//     return response;
//   },
//   (error: AxiosError): Promise<never> => {
//     // 超出 2xx 范围的状态码都会触发该函数。对响应错误时调用。
//     console.error('请求错误: ', error);
//     return Promise.reject(error);
//   }
// );
//
// // 移除请求拦截器
// axiosInatance.interceptors.request.eject(requestInterceptor);
//
// // 移除响应拦截器
// axiosInatance.interceptors.response.eject(responseInterceptor);
//
// export default axiosInatance;


import axios from 'axios'
import { BASE_URL, TIME_OUT } from '@/service/config'
import { LocalStorageUtils } from '@/utils/StorageUtils.ts'
import { errorMessage, successMessage } from '@/utils/ElMessageUtils.ts'

const api = axios.create({
	baseURL: BASE_URL,
	timeout: TIME_OUT,
	responseType: 'json'
	// withCredentials: true // 是否允许带cookie这些
	// headers: {'token': '6666666666666666666666666666'},  // 报错，但能添加到请求头。
})


/***************************************** 添加token【有 bug，推荐在 拦截器 中添加】 ******************************/
// api.defaults.headers.common['Token'] = LocalStorageUtils.getKey('wisdomToken')


/***************************************** 添加请求拦截器 ******************************************************/
api.interceptors.request.use(config => {
	config.headers['Content-Type'] = 'application/json;charset=UTF-8'
	let token = LocalStorageUtils.getKey('wisdomToken')
	// console.log('token +++++++> ', token)
	if (token) {
		// console.log(token)
		config.headers['token'] = token // 让每个请求携带自定义token 请根据实际情况自行修改。
	}
	// 在发送请求之前做些什么.
	// console.log('请求拦截器，config ===> ', config)
	// console.log('请求头 ===> ', config.headers)
	return config
}, err => {
	// 对请求错误做些什么.
	console.log('请求失败!!!!!!!!!!!!!!!')
	errorMessage(true, '请求失败！服务器出错啦 ~ ')
	return Promise.reject(err)
})

/***************************************** 添加响应拦截器 ******************************************************/

api.interceptors.response.use(res => {
	// 2xx 范围内的状态码都会触发该函数。
	// 对响应数据做点什么.
	// console.log('响应拦截器，res ===> ', res)
	return res.data
}, err => {
	// 超出 2xx 范围的状态码都会触发该函数。
	// 对响应错误做点什么.
	console.log('响应失败!!!!!!!!!!!!!!!')
	errorMessage(true, '响应失败！服务器出错啦 ~ ')
	return Promise.reject(err)
})


/***************************************** 测试示例代码 ******************************************************/

// console.log('=================测试连接=================')
// // 测试连接.....
// api.get('/testConnect')
// 	.then(res => {
// 		console.log('res:', res)
// 		console.log('请求结束')
// 		console.log('=================测试连接 成功！=================')
// 	})


export default api